package com.practice.reflect;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface DService {
    void offerService();
}

class DServer implements DService{
    @Override
    public void offerService() {
        System.out.println("提供服务中");
    }
}

class DServerDynamicProxy implements InvocationHandler{

    /**
     * 代理类中真实的对象
     */
    private Object target;

    public DServerDynamicProxy(Object target){
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("开始执行"+method.getName());
        Object result = method.invoke(target,args);
        System.out.println("结束执行"+method.getName());
        return result;
    }
}

/**
 * 动态代理
 * 核心类：Proxy 和 InvocationHandler
 * 通过Proxy创建代理对象，指定目标类(需要代理的对象的类)，目标代理接口，代理处理器（InvocationHandler）
 * 当需要代理目标方法时，通过代理对象，执行指定代理处理器的代理逻辑。
 * 相较于静态代理，更加灵活，对于同一个代理逻辑只需要编写一个代理处理器。
 * 底层原理是java的反射
 */
public class DynamicProxy {
    public static void main(String[] args) {
        //被代理对象
        DServer dServer = new DServer();
        //代理处理器
        InvocationHandler invocationHandler = new DServerDynamicProxy(dServer);
        //创建代理对象
        DService serviceProxy = (DService)Proxy.newProxyInstance(
                DServer.class.getClassLoader(), //目标类的类加载器
                new Class[] {DService.class}, //需要代理的方法接口
                invocationHandler //代理处理器
        );
        //调用代理方法
        serviceProxy.offerService();
    }
}
